package markdown

// DetailsInfo --> info
type DetailsInfo struct {
	Description    string `json:"description" description:"概览"`
	Version        string `json:"version" description:"版本信息"`
	Title          string `json:"title" description:"标题"`
	TermsOfService string `json:"termsOfService" description:"服务条款"`
	Contact        struct {
		Email string `json:"email" description:"邮箱"`
		Name  string `json:"name" description:"名称"`
		Url   string `json:"url" description:"联系地址"`
	} `json:"contact" description:"联系方式"`
	License struct {
		Name string `json:"name" description:"名称"`
		Url  string `json:"url" description:"链接地址"`
	} `json:"license" description:"许可信息"`

	Overview string
}

// Components --> components
type Components struct {
	Schemas         map[string]*SchemaOrItems                    `json:"schemas,omitempty"`
	Responses       map[string]*Response                         `json:"responses,omitempty"`
	Parameters      map[string]*RequestParameter                 `json:"parameters,omitempty"`
	Examples        map[string]*Example                          `json:"examples,omitempty"`
	RequestBodies   map[string]*RequestParameter                 `json:"requestBodies,omitempty"`
	Headers         map[string]*RequestParameter                 `json:"headers,omitempty"`
	SecuritySchemes map[string]*SecurityScheme                   `json:"securitySchemes,omitempty"`
	Links           map[string]*Link                             `json:"links,omitempty"`
	Callbacks       map[string]map[string]map[string]interface{} `json:"callbacks,omitempty"`
}

// TagsInfo  --> tags
type TagsInfo struct {
	Name         string `json:"name" description:"名称"`
	Description  string `json:"description" description:"说明"`
	ExternalDocs struct {
		Url         string `json:"url" description:"链接地址"`
		Description string `json:"description" description:"说明"`
	} `json:"externalDocs" description:"外部文档"`
	ApiList string `json:"apiList" description:"API列表"`
}

// OperationInfo --> paths
type OperationInfo struct {
	Tags         []string `json:"tags,omitempty"`
	Summary      string   `json:"summary,omitempty"`
	Description  string   `json:"description,omitempty"`
	ExternalDocs struct {
		Url         string `json:"url,omitempty"`
		Description string `json:"description,omitempty"`
	} `json:"externalDocs,omitempty"`
	OperationId string                `json:"operationId"`
	Consumes    []string              `json:"consumes"`
	Produces    []string              `json:"produces"`
	Parameters  []*RequestParameter   `json:"parameters"`
	RequestBody *RequestParameter     `json:"requestBody,omitempty"`
	Responses   map[string]*Response  `json:"responses"`
	Deprecated  bool                  `json:"deprecated"`
	Security    []map[string][]string `json:"security"`
}

type SecurityScheme struct {
	Type         string         `json:"type,omitempty"`
	Name         string         `json:"name,omitempty"`
	In           string         `json:"in,omitempty"`
	Schema       *SchemaOrItems `json:"schema,omitempty"`
	Description  string         `json:"description,omitempty"`
	BearerFormat string         `json:"bearerFormat,omitempty"`
	Flows        struct {
		Implicit          *OAuthFlow `json:"implicit,omitempty"`
		Password          *OAuthFlow `json:"password,omitempty"`
		ClientCredentials *OAuthFlow `json:"clientCredentials,omitempty"`
		AuthorizationCode *OAuthFlow `json:"authorizationCode,omitempty"`
	} `json:"flows,omitempty"`
	OpenIdConnectUrl string `json:"openIdConnectUrl,omitempty"`
}

type OAuthFlow struct {
	AuthorizationUrl string            `json:"authorizationUrl,omitempty"`
	TokenUrl         string            `json:"tokenUrl,omitempty"`
	RefreshUrl       string            `json:"refreshUrl,omitempty"`
	Scopes           map[string]string `json:"scopes,omitempty"`
}

type MediaType struct {
	Schema   *SchemaOrItems      `json:"schema,omitempty"`
	Example  interface{}         `json:"example,omitempty"`
	Examples map[string]Example  `json:"examples,omitempty"`
	Encoding map[string]Encoding `json:"encoding,omitempty"`
}

type Example struct {
	Summary       string      `json:"summary,omitempty"`
	Description   string      `json:"description,omitempty"`
	Value         interface{} `json:"value,omitempty"`
	ExternalValue string      `json:"externalValue,omitempty"`
	Ref           string      `json:"$ref,omitempty"`
}

type Encoding struct {
	ContentType   string                       `json:"contentType,omitempty"`
	Headers       map[string]*RequestParameter `json:"headers,omitempty"`
	Style         string                       `json:"style,omitempty"`
	Explode       bool                         `json:"explode,omitempty"`
	AllowReserved bool                         `json:"allowReserved,omitempty"`
}

type Link struct {
	OperationRef string                 `json:"operationRef,omitempty"`
	OperationId  string                 `json:"operationId,omitempty"`
	Parameters   map[string]interface{} `json:"parameters,omitempty"`
	RequestBody  interface{}            `json:"requestBody,omitempty"`
	Description  string                 `json:"description,omitempty"`
	Ref          string                 `json:"$ref,omitempty"`
	Server       struct {
		Url         string                    `json:"url,omitempty"`
		Description string                    `json:"description,omitempty"`
		Variables   map[string]*SchemaOrItems `json:"variables,omitempty"`
	} `json:"server,omitempty"`
}

type SchemaOrItems struct {
	Type                 string                    `json:"type,omitempty"`
	Format               string                    `json:"format,omitempty"`
	Items                *SchemaOrItems            `json:"items,omitempty"`
	Schema               *SchemaOrItems            `json:"schema,omitempty"`
	AllowEmptyValue      bool                      `json:"allowEmptyValue,omitempty"`
	CollectionFormat     string                    `json:"collectionFormat,omitempty"`
	Default              interface{}               `json:"default,omitempty"`
	Maximum              float64                   `json:"maximum,omitempty"`
	ExclusiveMaximum     bool                      `json:"exclusiveMaximum,omitempty"`
	Minimum              float64                   `json:"minimum,omitempty"`
	ExclusiveMinimum     bool                      `json:"exclusiveMinimum,omitempty"`
	MaxLength            int64                     `json:"maxLength,omitempty"`
	MinLength            int64                     `json:"minLength,omitempty"`
	Pattern              string                    `json:"pattern,omitempty"`
	MaxItems             int64                     `json:"maxItems,omitempty"`
	MinItems             int64                     `json:"minItems,omitempty"`
	UniqueItems          bool                      `json:"uniqueItems,omitempty"`
	Enum                 []interface{}             `json:"enum,omitempty"`
	MultipleOf           float64                   `json:"multipleOf,omitempty"`
	Ref                  string                    `json:"$ref,omitempty"`
	Title                string                    `json:"title,omitempty"`
	Description          string                    `json:"description,omitempty"`
	Deprecated           bool                      `json:"deprecated,omitempty"`
	MaxProperties        int64                     `json:"maxProperties,omitempty"`
	MinProperties        int64                     `json:"minProperties,omitempty"`
	Example              interface{}               `json:"example,omitempty"`
	Required             []string                  `json:"required,omitempty"`
	Properties           map[string]*SchemaOrItems `json:"properties,omitempty"`
	Nullable             bool                      `json:"nullable,omitempty"`
	AllOf                []*SchemaOrItems          `json:"allOf,omitempty"`
	OneOf                []*SchemaOrItems          `json:"oneOf,omitempty"`
	Not                  *SchemaOrItems            `json:"not,omitempty"`
	AnyOf                []*SchemaOrItems          `json:"anyOf,omitempty"`
	AdditionalProperties *SchemaOrItems            `json:"additionalProperties,omitempty"`
	Discriminator        interface{}               `json:"discriminator,omitempty"`
	ReadOnly             bool                      `json:"readOnly,omitempty"`
	WriteOnly            bool                      `json:"writeOnly,omitempty"`
	Xml                  struct {
		Name      string `json:"name,omitempty"`
		Namespace string `json:"namespace,omitempty"`
		Prefix    string `json:"prefix,omitempty"`
		Attribute bool   `json:"attribute,omitempty"`
		Wrapped   bool   `json:"wrapped,omitempty"`
	} `json:"xml,omitempty"`
	ExternalDocs struct {
		Url         string `json:"url,omitempty"`
		Description string `json:"description,omitempty"`
	} `json:"externalDocs,omitempty"`
}

// PageInfo 接口页面内容组织
type PageInfo struct {
	Description   string
	ApiUrl        string
	Method        string
	RequestParam  string
	ResponseParam string
}

// ParamInfo 参数信息组织
type ParamInfo struct {
	Name        string        `json:"name"`
	Description string        `json:"description"`
	Value       interface{}   `json:"value"`
	Type        string        `json:"type"`
	Required    bool          `json:"required"`
	Enum        []interface{} `json:"enum,omitempty"`
	Default     interface{}   `json:"default,omitempty"`

	ChildParamSchemaInfo []ParamInfo `json:"child_param_schema_info"`
	TableRow             []string    `json:"table"`
}

type showDocResp struct {
	ErrorCode float64 `json:"error_code"`
	Data      struct {
		PageId         string `json:"page_id"`
		AuthorUid      string `json:"author_uid"`
		AuthorUsername string `json:"author_username"`
		ItemId         string `json:"item_id"`
		CatId          string `json:"cat_id"`
		PageTitle      string `json:"page_title"`
		PageComments   string `json:"page_comments"`
		PageContent    string `json:"page_content"`
		SNumber        string `json:"s_number"`
		AddTime        string `json:"addtime"`
	} `json:"data"`
	ErrorMessage string `json:"error_message"`
}

type showDocParam struct {
	Url         string `json:"-"`
	ApiKey      string `json:"api_key"`
	ApiToken    string `json:"api_token"`
	CatName     string `json:"cat_name"`
	PageTitle   string `json:"page_title"`
	PageContent string `json:"page_content"`
	SNumber     int64  `json:"s_number"`
}

var (
	url = "%s/server/index.php?s=/api/item/updateByApi"

	templateHomepage = "\n\n### 标题" +
		"\n\n- {{.Title}}" +
		//"\n\n### 描述" +
		//"\n\n{{.Description}}" +
		"\n\n### 版本信息" +
		"\n\n- {{.Version}}" +
		"\n\n### 联系方式" +
		"\n\n- **邮箱**: {{.Contact.Email}}" +
		"\n\n- **名称**: {{.Contact.Name}}" +
		"\n\n- **联系地址**: {{.Contact.Url}}" +
		//"\n\n### 服务条款" +
		//"\n\n{{.TermsOfService}}" +
		//"\n\n### License" +
		//"\n\n- **名称**: {{.License.Name}}" +
		//"\n\n- **链接地址**: {{.License.Url}}" +
		"\n\n### API列表概览" +
		"\n\n{{.Overview}}"

	templateOverview = "\n\n#### {{.Name}}" +
		"\n\n##### 描述" +
		"\n\n{{.Description}}" +
		"\n\n##### 接口列表" +
		"\n\n{{.ApiList}}"
	//"\n\n##### 外部文档" +
	//"\n\n- **地址**: {{.ExternalDocs.Url}}" +
	//"\n\n- **说明**: {{.ExternalDocs.Description}}"

	templatePage = "\n\n### 简要描述" +
		"\n\n{{.Description}}" +
		"\n\n### 请求URL" +
		"\n\n- ` {{.ApiUrl}} `" +
		"\n\n### 请求方式" +
		"\n\n- ` {{.Method}} `" +
		"\n\n### 请求参数" +
		"{{.RequestParam}}" + //get、post
		"\n\n### 响应参数" +
		"{{.ResponseParam}}" //返回参数说明

	// request
	templateReqParamTable = "\n\n|参数名|必需|类型|说明|" +
		"\n|:-----  |:-----|:-----|" +
		"\n%s" // 参数表格

	templateParamReq = "\n\n|参数名|参数类型|必需|类型|说明|" +
		"\n|:----    |:-----|:---|:----- |:-----   |" +
		"\n%s" // 参数表格

	templateExPost = "\n\n#### `%s`" + //body参数
		"\n\n##### 参数示例" +
		"\n%s" + // json文本
		"\n\n##### 字段说明" +
		"\n%s" // 字段释义

	templateExample = "\n%s" +
		"\n```json \n%s \n```"

	// response
	templateParamResp = "\n\n|参数名|类型|MIME 类型|说明|" +
		"\n|:-----  |:-----|:-----|:-----|" +
		"\n%s" // 参数表格

	templateParamDesc     = "\n\n##### 字段说明" + templateResParamTable
	headerList            = "\n\n##### Headers" + templateResParamTable
	templateResParamTable = "\n\n|参数名|类型|说明|" +
		"\n|:-----  |:-----|:-----|" +
		"\n%s" // 参数表格

	templateExResp = "\n\n#### `%s`" + //状态码
		"\n\n##### 参数示例" +
		"\n```json \n%s \n```" +
		"\n\n%s" // 字段释义 + // json文本
)
